package org.java.introspector;

import org.junit.Test;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;

/**
 * 测试通过Introspector 调用方法
 * Created by Administrator on 2016/11/28.
 */
public class BeanInfoUtil {

    public static void main(String[] args) throws Exception {
        // 测试通过PropertyDescriptor来修改类的属性值
        //setPropertyByPropertyDescriptor(new UserInfo(), "userName", "wevil");

        // 测试通过java内省获取类的属性值
        /*
        * 通过这两个方法的比较可以看出，都是需要获得PropertyDescriptor，只是方式不一样：
        * 前者通过创建对象直接获得，后者需要遍历，所以使用PropertyDescriptor类更加方便。
        * */
        setPropertyByIntrospector(new UserInfo(), "userName");
    }

    /**
     * 通过PropertyDescriptor修改类的属性值
     *
     * @param object        要获取信息的类对象
     * @param propertyName  属性名
     * @param propertyValue 属性值
     */
    public static void setPropertyByPropertyDescriptor(Object object, String propertyName, Object propertyValue) throws Exception {
        // 获取属性描述对象
        PropertyDescriptor propDesc = new PropertyDescriptor(propertyName, object.getClass());

        // 获取属性的set方法
        Method methodSetProperty = propDesc.getWriteMethod();
        methodSetProperty.invoke(object, propertyValue);

        // 获取属性的get方法
        Method methodGetProperty = propDesc.getReadMethod();
        System.out.println(propertyName + " = " + methodGetProperty.invoke(object));
    }

    /**
     * 通过java 内省 获取 类的属性值
     *
     * @param userInfo UserInfo对象
     * @param userName 属性名
     */
    public static void setPropertyByIntrospector(UserInfo userInfo, String userName) throws Exception {
        BeanInfo beanInfo = Introspector.getBeanInfo(UserInfo.class);
        PropertyDescriptor[] proDescrtptors = beanInfo.getPropertyDescriptors();
        if (proDescrtptors != null && proDescrtptors.length > 0) {
            for (PropertyDescriptor propDesc : proDescrtptors) {
                if (propDesc.getName().equals(userName)) {
                    Method methodSetUserName = propDesc.getWriteMethod();
                    methodSetUserName.invoke(userInfo, "alan");
                    System.out.println("set userName:" + userInfo.getUserName());
                    break;
                }
            }
        }
    }
}
